package com.dms.modules.product.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dms.modules.product.dto.ProductDTO;
import com.dms.modules.product.dto.ProductSearchDTO;
import com.dms.modules.product.entity.Product;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * 商品Mapper接口
 */
@Mapper
public interface ProductMapper extends BaseMapper<Product> {
    
    /**
     * 搜索商品
     *
     * @param page 分页参数
     * @param search 搜索条件
     * @return 商品列表
     */
    Page<ProductDTO> searchProducts(Page<ProductDTO> page, @Param("search") ProductSearchDTO search);

    /**
     * 获取商品详情
     *
     * @param id 商品ID
     * @return 商品详情
     */
    ProductDTO getProductDetail(@Param("id") Long id);

    /**
     * 搜索商品
     */
    IPage<Product> search(Page<Product> page, @Param("search") ProductSearchDTO search);

    /**
     * 获取热门商品
     */
    List<Product> getHotProducts(@Param("limit") Integer limit);

    /**
     * 获取新品列表
     */
    List<Product> getNewProducts(@Param("limit") Integer limit);

    /**
     * 获取搜索建议
     */
    List<String> getSearchSuggestions(@Param("keyword") String keyword, @Param("limit") Integer limit);

    /**
     * 获取用户搜索历史
     */
    List<String> getSearchHistory(@Param("userId") Long userId, @Param("limit") Integer limit);

    /**
     * 商家搜索商品
     */
    IPage<Product> searchMerchantProducts(Page<Product> page, @Param("search") ProductSearchDTO search, @Param("status") Integer status);

    /**
     * 管理员搜索商品
     */
    IPage<Product> adminSearchProducts(Page<Product> page, @Param("search") ProductSearchDTO search, @Param("auditStatus") Integer auditStatus);

    /**
     * 获取待审核商品列表
     */
    IPage<Product> getAuditPendingProducts(Page<Product> page);

    /**
     * 增加商品浏览次数
     *
     * @param id 商品ID
     * @return 影响行数
     */
    @Update("UPDATE product SET view_count = view_count + 1 WHERE id = #{id}")
    int incrementViewCount(@Param("id") Long id);

    @Select("SELECT p.* FROM product p " +
            "JOIN product_similarity ps ON p.id = ps.product_id2 " +
            "WHERE ps.product_id1 = #{productId} " +
            "ORDER BY ps.similarity DESC " +
            "LIMIT #{limit}")
    List<Product> getSimilarProducts(@Param("productId") Long productId, @Param("limit") Integer limit);

    /**
     * 批量获取完整的商品信息
     * @param productIds 商品ID列表
     * @return 商品列表
     */
    List<Product> selectProductsWithDetails(@Param("productIds") List<Long> productIds);
} 